s8 st,
u16 offset,
u16 size,
- u16 csum_valid);
+ u16 flags);
static void net_tx_action(unsigned long unused);
static DECLARE_TASKLET(net_tx_tasklet, net_tx_action, 0);
id = RING_GET_REQUEST(&netif->rx, netif->rx.rsp_prod_pvt)->id;
if (make_rx_response(netif, id, status,
(unsigned long)skb->data & ~PAGE_MASK,
- size, skb->proto_csum_valid) &&
+ size, skb->proto_csum_valid ?
+ NETRXF_csum_valid : 0) &&
(rx_notify[irq] == 0)) {
rx_notify[irq] = 1;
notify_list[notify_nr++] = irq;
*/
skb->ip_summed = CHECKSUM_UNNECESSARY;
skb->proto_csum_valid = 1;
- skb->proto_csum_blank = txreq.csum_blank;
+ skb->proto_csum_blank = !!(txreq.flags & NETTXF_csum_blank);
netif->stats.rx_bytes += txreq.size;
netif->stats.rx_packets++;
s8 st,
u16 offset,
u16 size,
- u16 csum_valid)
+ u16 flags)
{
RING_IDX i = netif->rx.rsp_prod_pvt;
netif_rx_response_t *resp;
resp = RING_GET_RESPONSE(&netif->rx, i);
resp->offset = offset;
- resp->csum_valid = csum_valid;
+ resp->flags = flags;
resp->id = id;
resp->status = (s16)size;
if (st < 0)
tx->gref = np->grant_tx_ref[id] = ref;
tx->offset = (unsigned long)skb->data & ~PAGE_MASK;
tx->size = skb->len;
- tx->csum_blank = (skb->ip_summed == CHECKSUM_HW);
+ tx->flags = (skb->ip_summed == CHECKSUM_HW) ? NETTXF_csum_blank : 0;
np->tx.req_prod_pvt = i + 1;
RING_PUSH_REQUESTS_AND_CHECK_NOTIFY(&np->tx, notify);
skb->len = rx->status;
skb->tail = skb->data + skb->len;
- if ( rx->csum_valid )
+ if ( rx->flags & NETRXF_csum_valid )
skb->ip_summed = CHECKSUM_UNNECESSARY;
np->stats.rx_packets++;
tx->gref = np->grant_tx_ref[i];
tx->offset = (unsigned long)skb->data & ~PAGE_MASK;
tx->size = skb->len;
- tx->csum_blank = (skb->ip_summed == CHECKSUM_HW);
+ tx->flags = (skb->ip_summed == CHECKSUM_HW) ?
+ NETTXF_csum_blank : 0;
np->stats.tx_bytes += skb->len;
np->stats.tx_packets++;
* or rsp_event field in the shared ring.
*/
+/* Protocol checksum field is blank in the packet (hardware offload)? */
+#define _NETTXF_csum_blank (0)
+#define NETTXF_csum_blank (1U<<_NETTXF_csum_blank)
+
typedef struct netif_tx_request {
grant_ref_t gref; /* Reference to buffer page */
- uint16_t offset:15; /* Offset within buffer page */
- uint16_t csum_blank:1; /* Proto csum field blank? */
+ uint16_t offset; /* Offset within buffer page */
+ uint16_t flags; /* NETTXF_* */
uint16_t id; /* Echoed in response message. */
uint16_t size; /* Packet size in bytes. */
} netif_tx_request_t;
typedef struct netif_tx_response {
uint16_t id;
- int8_t status;
+ int16_t status; /* NETIF_RSP_* */
} netif_tx_response_t;
typedef struct {
grant_ref_t gref; /* Reference to incoming granted frame */
} netif_rx_request_t;
+/* Protocol checksum already validated (e.g., performed by hardware)? */
+#define _NETRXF_csum_valid (0)
+#define NETRXF_csum_valid (1U<<_NETRXF_csum_valid)
+
typedef struct {
- uint16_t offset; /* Offset in page of start of received packet */
- uint16_t csum_valid; /* Protocol checksum is validated? */
uint16_t id;
- int16_t status; /* -ve: BLKIF_RSP_* ; +ve: Rx'ed pkt size. */
+ uint16_t offset; /* Offset in page of start of received packet */
+ uint16_t flags; /* NETRXF_* */
+ int16_t status; /* -ve: BLKIF_RSP_* ; +ve: Rx'ed pkt size. */
} netif_rx_response_t;
/*